home *** CD-ROM | disk | FTP | other *** search
/ ftp.mactech.com 2010 / ftp.mactech.com.tar / ftp.mactech.com / machack / Hacks96 / FlyPaper.sit / Fly Paper / FlyPaper Source / WDEF / NuScrappy.cpp next >
C/C++ Source or Header  |  1996-06-22  |  9KB  |  382 lines

  1. #include <A4Stuff.h>
  2.  
  3. typedef struct {
  4.     WindowPeek        theWindow;
  5.     short            varCode;
  6.     CTabPtr            colorTable;
  7. } DeviceLoopData;
  8.  
  9. typedef struct {
  10.     Rect            r1, r2;
  11.     Boolean            closeBoxHilited;
  12. } WindowDataRec, **WindowDataHandle;
  13.  
  14.  
  15. #define        kDragWidth                12
  16. #define        kCloseBoxSize            7    
  17. #define        kCloseBoxYMargin        4
  18. #define        kCloseBoxXMargin        2
  19.  
  20. #define        kFrameColor                1
  21. #define        kDragBarColor            5
  22. #define        kCloseBoxColor            6
  23.  
  24. #define        kDragOnLeftVarCode        1
  25. #define        kDragBarVarCode            2
  26. #define        kShadowVarCode            4
  27.  
  28. #define    kZigSize            3
  29.  
  30. CGrafPort    gColorPort;
  31. GrafPtr        gOldPort;
  32.  
  33. static
  34. void StartUsingColor ()
  35. {
  36.     GetPort (&gOldPort);
  37.     OpenCPort (&gColorPort);
  38.     
  39.     CopyRgn (gOldPort -> clipRgn, gColorPort.clipRgn);
  40.     CopyRgn (gOldPort -> visRgn, gColorPort.visRgn);
  41. }
  42.  
  43. static
  44. void StopUsingColor ()
  45. {
  46.     CloseCPort (&gColorPort);
  47.     SetPort (gOldPort);
  48. }
  49.  
  50. static
  51. void        ZigZag (short varCode, Point start, Point finish)
  52. {
  53.     short    horizontalOffset = (varCode & kDragOnLeftVarCode) ? -kZigSize : kZigSize;
  54.     
  55.     while (start.v > finish.v) {
  56.         LineTo (start.h += horizontalOffset, start.v -= kZigSize);
  57.         horizontalOffset *= -1;
  58.     }
  59. }
  60.  
  61. static
  62. void        MakeBorder (short varCode, Rect& contentRect, Boolean outset)
  63. {
  64.     Point    frameStart, frameFinish, zigStart, zigFinish;
  65.     short    width;
  66.     short    height, slop;
  67.  
  68.     {
  69.         Rect        bounds = contentRect;
  70.  
  71.         if (varCode & kDragOnLeftVarCode) {
  72.                         
  73.             if (outset) {
  74.                 frameStart.v = bounds.top - 1;
  75.                 frameStart.h = bounds.right + 1;
  76.                 frameFinish.v = bounds.bottom + 1;
  77.                 frameFinish.h = bounds.right + 1;
  78.                 
  79.                 width = bounds.left - bounds.right - 2;
  80.  
  81.                 zigStart.v = frameFinish.v - 1;
  82.                 zigStart.h = frameFinish.h;
  83.                 zigFinish.v = frameStart.v + 1;
  84.                 zigFinish.h = frameStart.h;
  85.             } else {
  86.             
  87.                 frameStart.v = bounds.top;
  88.                 frameStart.h = bounds.right;
  89.                 frameFinish.v = bounds.bottom;
  90.                 frameFinish.h = bounds.right;
  91.                 width = bounds.left - bounds.right;
  92.             
  93.                 zigStart = frameFinish;
  94.                 zigFinish = frameStart;
  95.             }
  96.         } else {
  97.             
  98.             if (outset) {
  99.                 frameStart.v = bounds.top - 1;
  100.                 frameStart.h = bounds.left - 1;
  101.                 frameFinish.v = bounds.bottom + 1;
  102.                 frameFinish.h = bounds.left - 1;
  103.                 
  104.                 width = bounds.right - bounds.left + 2;
  105.  
  106.                 zigStart.v = frameFinish.v - 1;
  107.                 zigStart.h = frameFinish.h;
  108.                 zigFinish.v = frameStart.v + 1;
  109.                 zigFinish.h = frameStart.h;
  110.             } else {
  111.             
  112.                 frameStart.v = bounds.top;
  113.                 frameStart.h = bounds.left;
  114.                 frameFinish.v = bounds.bottom;
  115.                 frameFinish.h = bounds.left;
  116.                 width = bounds.right - bounds.left;
  117.             
  118.                 zigStart = frameFinish;
  119.                 zigFinish = frameStart;
  120.             }
  121.         }
  122.     }
  123.  
  124.     MoveTo (frameStart.h, frameStart.v);
  125.     LineTo (frameStart.h + width, frameStart.v);
  126.     LineTo (frameStart.h + width, frameFinish.v);
  127.     LineTo (frameFinish.h, frameFinish.v);
  128.  
  129.     LineTo (zigStart.h, zigStart.v);
  130.     
  131.     // calculate slop
  132.     height = zigStart.v - zigFinish.v;
  133.     slop = height % (kZigSize * 2);
  134.     
  135.     Point    actualZigStart = {    zigStart.v -= slop / 2, zigStart.h };
  136.     Point    actualZigFinish = {    zigFinish.v + (slop - (slop / 2)), zigFinish.h };
  137.  
  138.     LineTo (actualZigStart.h, actualZigStart.v);
  139.     
  140.     // ZigZag from start to finish
  141.     ZigZag (varCode, actualZigStart, actualZigFinish);
  142.     
  143.     LineTo (zigFinish.h, zigFinish.v);
  144. }
  145.  
  146. static
  147. void        CalcDragRect (short varCode, Rect& contentRect, Rect &dragRect)
  148. {
  149.     dragRect.top = contentRect.top;
  150.     dragRect.left = (varCode & kDragOnLeftVarCode) ? contentRect.left - kDragWidth : contentRect.right;
  151.     dragRect.bottom = contentRect.bottom;
  152.     dragRect.right = dragRect.left + kDragWidth;
  153. }
  154.  
  155. static
  156. void        CalcCloseRect (short varCode, Rect& contentRect, Rect &closeRect)
  157.  
  158. {
  159.     Rect        dragRect;
  160.     CalcDragRect (varCode, contentRect, dragRect);
  161.     
  162.     closeRect.top = dragRect.top + kCloseBoxYMargin;
  163.     closeRect.left = (varCode & kDragOnLeftVarCode) ? dragRect.left + kCloseBoxXMargin : dragRect.right - kCloseBoxXMargin - kCloseBoxSize;
  164.     closeRect.bottom = closeRect.top + kCloseBoxSize;
  165.     closeRect.right = closeRect.left + kCloseBoxSize;
  166. }
  167.  
  168. static
  169. void        CalcRgns (short varCode, WindowPeek theWindow)
  170.  
  171. {
  172.     // content rect is in global coordinates
  173.     Rect        contentRect = theWindow -> port.portRect;
  174.     OffsetRect (&contentRect, -theWindow -> port.portBits.bounds.left,
  175.                     -theWindow -> port.portBits.bounds.top);
  176.  
  177.     // make content rgn
  178.     OpenRgn ();
  179.     MakeBorder (varCode, contentRect, false);
  180.     CloseRgn (theWindow -> contRgn);
  181.     
  182.     // make border of content rgn
  183.     OpenRgn ();
  184.     MakeBorder (varCode, contentRect, true);
  185.     CloseRgn (theWindow -> strucRgn);
  186.     
  187.     Rect        dragRect;
  188.     CalcDragRect (varCode, contentRect, dragRect);
  189.         
  190.     // add drag rgn to struc rgn
  191.     RgnHandle    scratchRgn = NewRgn ();
  192.  
  193.     if (varCode & kDragBarVarCode) {
  194.         InsetRect (&dragRect, 0, -1);
  195.         if (varCode & kDragOnLeftVarCode)
  196.             dragRect.left--;
  197.         else
  198.             dragRect.right++;
  199.         RectRgn (scratchRgn, &dragRect);
  200.         UnionRgn (theWindow -> strucRgn, scratchRgn, theWindow -> strucRgn);
  201.     }
  202.     
  203.     if (varCode & kShadowVarCode) {
  204.         // create drop shadow and add to struc rgn
  205.         CopyRgn (theWindow -> strucRgn, scratchRgn);
  206.         OffsetRgn (scratchRgn, 1, 1);
  207.         UnionRgn (theWindow -> strucRgn, scratchRgn, theWindow -> strucRgn);
  208.     }
  209.     
  210.     DisposeRgn (scratchRgn);
  211. }
  212.  
  213. static
  214. void    DrawCloseBox (short varCode, WindowPeek theWindow, Boolean invert, CTabPtr colorTable)
  215.  
  216. {
  217.     Rect        r;
  218.     
  219.     if (!theWindow -> goAwayFlag)
  220.         return;
  221.         
  222.     Rect        bbox = (**theWindow -> contRgn).rgnBBox;
  223.  
  224.     CalcCloseRect (varCode, bbox, r);
  225.     ForeColor (blackColor);
  226.         
  227.     FrameRect (&r);
  228.     
  229.     InsetRect (&r, 1, 1);
  230.     
  231.     if (invert)
  232.         (**((WindowDataHandle) theWindow -> dataHandle)).closeBoxHilited =
  233.             !(**((WindowDataHandle) theWindow -> dataHandle)).closeBoxHilited;
  234.     
  235.     if ((**((WindowDataHandle) theWindow -> dataHandle)).closeBoxHilited) {
  236.         RGBForeColor (&colorTable -> ctTable [1].rgb);
  237.         PaintRect (&r);
  238.     } else
  239.         EraseRect (&r);
  240. }
  241.  
  242. static
  243. pascal void myDrawDragBarProc (short depth, short flags, GDHandle device, DeviceLoopData *data)
  244. {
  245.     EnterCodeResource ();
  246.     
  247.     Rect        r;
  248.     Rect        temp = (**data -> theWindow -> contRgn).rgnBBox;
  249.     
  250.     CalcDragRect (data -> varCode, temp, r);
  251.     
  252.     RGBForeColor (&data -> colorTable -> ctTable [4].rgb);
  253.     PaintRect (&r);
  254.     
  255.     RGBForeColor (&data -> colorTable -> ctTable [1].rgb);
  256.     if (data -> varCode & kDragOnLeftVarCode) {
  257.         MoveTo (r.right - 1, r.top);
  258.         LineTo (r.right - 1, r.bottom);
  259.     } else {
  260.         MoveTo (r.left, r.top);
  261.         LineTo (r.left, r.bottom);
  262.     }
  263.     
  264.     DrawCloseBox (data -> varCode, data -> theWindow, false, data -> colorTable);
  265.         
  266.     SetA4 (oldA4);
  267. }
  268.  
  269. static
  270. void    DrawDragBar (short varCode, WindowPeek theWindow, CTabPtr colorTable)
  271.  
  272. {
  273.     DeviceLoopData        data;
  274.     
  275.     data.theWindow = theWindow;
  276.     data.varCode = varCode;
  277.     data.colorTable = colorTable;
  278.     
  279.     DeviceLoop (GetGrayRgn (), (DeviceLoopDrawingUPP) myDrawDragBarProc,
  280.             (long) &data, singleDevices);
  281. }
  282.  
  283. static
  284. void    DrawEverything (short varCode, WindowPeek theWindow, CTabPtr colorTable)
  285.  
  286. {
  287.     if (!theWindow -> visible)
  288.         return;
  289.     
  290.     RgnHandle        r = NewRgn ();
  291.     RgnHandle        scratch = NewRgn ();
  292.         
  293.     Rect    dragRect;
  294.     Rect    bbox = (**theWindow -> contRgn).rgnBBox;
  295.     CalcDragRect (varCode, bbox, dragRect);
  296.     
  297.     RectRgn (scratch, &dragRect);
  298.     CopyRgn (theWindow -> strucRgn, r);
  299.     
  300.     DiffRgn (r, scratch, r);
  301.     DiffRgn (r, theWindow -> contRgn, r);
  302.     
  303.     // Draw frame
  304.     RGBForeColor (&colorTable -> ctTable [1].rgb);
  305.     PaintRgn (r);
  306.     DrawDragBar (varCode, theWindow, colorTable);
  307.  
  308.     DisposeRgn (r);
  309.     DisposeRgn (scratch);
  310. }
  311.  
  312. static
  313. short    DoHit (short varCode, WindowPeek theWindow, Point where)
  314. {
  315.     Rect        contentRect = (**theWindow -> contRgn).rgnBBox;
  316.     
  317.     if (theWindow -> hilited && theWindow -> goAwayFlag) {
  318.         Rect        closeRect;
  319.         CalcCloseRect (varCode, contentRect, closeRect);
  320.         if (PtInRect (where, &closeRect))
  321.             return (wInGoAway);
  322.     } 
  323.     
  324.     Rect        dragRect;
  325.     CalcDragRect (varCode, contentRect, dragRect);
  326.     if (PtInRect (where, &dragRect))
  327.         return (wInDrag);
  328.     
  329.     return (wInContent);
  330. }
  331.  
  332. pascal long main (short varCode, WindowPeek theWindow, short message, long param)
  333.  
  334. {
  335.     EnterCodeResource ();
  336.     short            retVal;
  337.     
  338.     switch (message) {
  339.     
  340.     
  341.         case (wDraw) :
  342.             AuxWinHandle        wctb;
  343.             
  344.             GetAuxWin ((WindowPtr) theWindow, &wctb);
  345.             SignedByte        state = HGetState ((Handle) (**wctb).awCTable);
  346.             HLock ((Handle) (**wctb).awCTable);
  347.             
  348.             StartUsingColor ();
  349.             
  350.             if (param == wInGoAway)
  351.                 DrawCloseBox (varCode, theWindow, true, *(**wctb).awCTable);
  352.             else
  353.                 DrawEverything (varCode, theWindow, *(**wctb).awCTable);
  354.             HSetState ((Handle) (**wctb).awCTable, state);
  355.             
  356.             StopUsingColor ();
  357.             break;
  358.             
  359.         case (wHit) :
  360.             retVal = DoHit (varCode, theWindow, *((Point*)¶m));
  361.             break;
  362.             
  363.         case (wCalcRgns) :
  364.             CalcRgns (varCode, theWindow);
  365.             break;
  366.             
  367.         case (wNew) :
  368.             theWindow -> dataHandle = NewHandleClear (sizeof (WindowDataRec));
  369.             break;
  370.             
  371.         case (wDispose) :
  372.             DisposeHandle (theWindow -> dataHandle);
  373.             break;
  374.             
  375.         default :
  376.             return 0;
  377.                 
  378.     }
  379.     
  380.     ExitCodeResource ();
  381.     return (retVal);
  382. }